7367
18115
Minulla on luettelo kertaa sekunneissa, kuten:
L = [0,10218048, 1,20851996, 1,46800021, 1,73429061, 2,71525848,
3.14781922, 3.63637958, 5.11147358, 5.97497864, 6.35469013,
6.80623747, 6.99571917, 7.65215123, 7.86108352, 8.52988247,
8.83068894, 10.07690977, 11.53867284, 12.01214112, 12.13307653]
Kullekin 2 sekunnin pituiselle ikkunalle, joka alkaa toisesta rajasta, haluaisin antaa luettelon kaikista 2 sekunnin ikkunaan kuuluvista aikoista. Joten yllä olevassa esimerkissä se olisi:
[0.10218048, 1.20851996, 1.46800021, 1.73429061]
[1.20851996, 1.46800021, 1.73429061, 2.71525848]
[2.71525848, 3.14781922, 3.63637958]
[3.14781922, 3.63637958]
[5.11147358, 5.97497864]
[5.11147358, 5.97497864, 6.35469013, 6.80623747, 6.99571917]
[6.35469013, 6.80623747, 6.99571917, 7.65215123, 7.86108352]
[7.65215123, 7.86108352, 8.52988247, 8.83068894]
[8.52988247, 8.83068894]
[10.07690977]
[10.07690977, 11.5386728]
[11.5386728, 12.01214112, 12.13307653]
[12.01214112, 12.13307653]
Yleensä ikkunan pituus voi olla erilainen kuin 2.
Kuinka voit tehdä tämän? 
Luulen, että tarkoitit lisäystä, joka perustuu "Jokaiselle 2 sekunnin pituiselle ikkunalle, joka alkaa toisesta rajasta", eikä päällekkäisyyttä. Kahden sekunnin välein se on sama, mutta koska haluat muuttaa pituutta, yhden sekunnin päällekkäisyys olisi 0-3, 2-5, 4-7, mutta lisäys merkitsisi 0-3, 1-4, 2- 5. Oli kuitenkin mielenkiintoista keksiä ratkaisut molemmille vain siinä tapauksessa.
Olettaen, että L on lajiteltu ja kaikki elementit ovat positiivisia ja kaikki toiset välit alkavat kokonaisluvuilla, voimme käyttää tätä menetelmää:
tuo matematiikkaa
kokoelmista tuo oletusarvo
L = [0,10218048, 1,20851996, 1,46800021, 1,73429061, 2,71525848,
3.14781922, 3.63637958, 5.11147358, 5.97497864, 6.35469013,
6.80623747, 6.99571917, 7.65215123, 7.86108352, 8.52988247,
8.83068894, 10.07690977, 11.53867284, 12.01214112, 12.13307653]
omat alueesi = oletusarvo (luettelo)
väli_leveys = 2
x: lle L: ssä:
ylempi_sidottu = math.ceil (x)
Lower_bound = upper_bound - aikavälin leveys
alempi_raja = enimmäismäärä (0, alempi_raja)
y alueella (ala_raja, ylempi_raja):
omat alueet [y]. liitä (x)
lajitellulle (omat alueet):
tulosta (omat alueet [a])
En tiedä, haluatko nähdä, onko tyhjiä alueita. Mutta defaultdict tulostaa myös tyhjät alueet, jos haluat. Käytä tätä riviä sanan "a in a sorted" sijasta:
a-alueella (min (omat alueet), max (omat alueet) + 1):
Jos haluat alueet 0-3, 2-5, 4-7, tämä toimii:
tuo matematiikkaa
kokoelmista tuo oletusarvo
L = [0,10218048, 1,20851996, 1,46800021, 1,73429061, 2,71525848,
3.14781922, 3.63637958, 5.11147358, 5.97497864, 6.35469013,
6.80623747, 6.99571917, 7.65215123, 7.86108352, 8.52988247,
8.83068894, 10.07690977, 11.53867284, 12.01214112, 12.13307653]
väli_leveys = 2
omat_alueet_2 = oletusarvo (luettelo)
x: lle L: ssä:
ehdottomasti_in = (x // (aikavälin_leveys - 1)) * (aikavälin_leveys - 1) # x: n alapuolella olevan intervallileveyden alin moninkertainen tulee aina olemaan
#print ("Lisätään", x, "kohteeseen", ehdottomasti_in)
omat_alueet_2 [ehdottomasti_sisällössä]. liitä (x)
Jos x  = 0: # esimerkiksi, jos x on 2,3 ja meillä on 0,3 2,5 jne. ... meidän on löydettävä tämä kaksoiskappale. Oletan, että ikkunan pituudet ovat kokonaislukuja, ja jos ei, meillä on paljon enemmän tehtävää, koska numero voi mennä useammassa kuin yhdessä taulukossa. Ehkä meillä voisi olla jonkin aikaa silmukka, kasvaa (väli_leveys - 1)
#print ("++ lisääminen", x, "kohteeseen", ehdottomasti_väli - aikavälin_leveys + 1)
omat_alueet_2 [ehdottomasti_väli_väli_leveys + 1]. liitä (x)
lajitellulle (omat_alueet_2):
tulosta (a, omat_alueet_2 [a])
# tulosta (omat_alueet_2 [a])
Epäilen, että on joitain yksityiskohtia, jotka olen unohtanut, mutta toivottavasti voit piilottaa interval_width tarpeen mukaan varmistaaksesi, että koodi toimii toivomallasi tavalla, ja kerro minulle mitä tarvitset.
|
Mahdollinen ratkaisu, jonka voin ehdottaa, on "tehokas" tietyssä mielessä, että se toistuu vain kerran syötetietojen kautta eikä sillä ole riippuvuuksia. Kustannus on tietysti se, että se kirjoitetaan puhtaana pythonina (optimoitua koodia saattaa olla enemmän) ja että se tuo lisää seurantamuuttujia toistamisen estämiseksi (ja on siten vähemmän pythoninen).
def sliding_window (data, kesto, aloitus = 0, päällekkäisyys = 1):
tulos = []
data_idx = 0
tulos_idx = 0
ylempi = aloitus + kesto
alempi = alku
seuraava_matala = ylempi - päällekkäisyys
# sisäinen auttaja tyhjien sisäisten luetteloiden täyttämiseksi lisäyskohdamme ja lisäyksen kohdalle
def pad_and_append (at):
kun len (tulos) <= at:
result.append ([])
tulos [at] .append (data [data_idx])
# iteroida syötetietojen kautta
kun data_idx  a:
jos x  = l [0]) & (L  = i) & (L